home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 24 / Amiga Format AFCD24 (Feb 1998, Issue 108).iso / -in_the_mag- / emulation / amiga / uae-0.7.0b2 / src / xui.c < prev    next >
C/C++ Source or Header  |  1998-01-20  |  4KB  |  218 lines

  1.  /*
  2.   * UAE - The Un*x Amiga Emulator
  3.   *
  4.   * Interface to the Tcl/Tk GUI
  5.   *
  6.   * Copyright 1996 Bernd Schmidt
  7.   */
  8.  
  9. #include "sysconfig.h"
  10. #include "sysdeps.h"
  11. #include <signal.h>
  12.  
  13. #include "config.h"
  14. #include "options.h"
  15. #include "uae.h"
  16. #include "memory.h"
  17. #include "custom.h"
  18. #include "readcpu.h"
  19. #include "newcpu.h"
  20. #include "disk.h"
  21. #include "gui.h"
  22.  
  23. static int inpipe, outpipe;
  24. static char *child_argv[4];
  25. static char filename1[80];
  26. static char filename2[80];
  27. static int made_file = 0;
  28. static struct stat stbuf;
  29. static pid_t child_pid;
  30. static int child_died = 0;
  31.  
  32. static void sigchldhandler(int foo)
  33. {
  34.     child_died = 1;
  35. }
  36.  
  37. void gui_changesettings(void)
  38. {
  39.  
  40. }
  41.  
  42. int gui_init(void)
  43. {
  44.     struct timeval tv;
  45.     int result;
  46.  
  47.     gettimeofday(&tv, NULL);
  48.     sprintf(filename1, "/tmp/uaea%d", tv.tv_sec * 1000 + tv.tv_usec / 1000);
  49.     result = mknod (filename1, 0600 | S_IFIFO, 0);
  50.     if (result < 0)
  51.     return result;
  52.     made_file = 1;
  53.  
  54.     sprintf(filename2, "/tmp/uaeb%d", tv.tv_sec * 1000 + tv.tv_usec / 1000);
  55.     result = mknod (filename2, 0600 | S_IFIFO, 0);
  56.     if (result < 0)
  57.     return result;
  58.     made_file = 2;
  59.  
  60.     inpipe = open (filename1, O_RDONLY|O_NONBLOCK);
  61.     if (inpipe < 0)
  62.     return inpipe;
  63.  
  64.     /* Why doesn't O_WRONLY work? */
  65.     outpipe = open (filename2, O_RDWR);
  66.     if (outpipe < 0)
  67.     return outpipe;
  68.  
  69.     fstat (inpipe, &stbuf);
  70.     child_pid = fork();
  71.     if (child_pid < 0)
  72.     return child_pid;
  73.     if (child_pid > 0) {
  74.     fd_set fs;
  75.     printf("Waiting for GUI process to start...\n");
  76.     FD_ZERO(&fs);
  77.     FD_SET(inpipe, &fs);
  78.     signal(SIGCHLD, sigchldhandler);
  79.     result = select(inpipe+1, &fs, NULL, NULL, NULL);
  80.     if (result < 0) {
  81.         kill(child_pid, SIGTERM);
  82.         return -1;
  83.     } else {
  84.         char buffer[20];
  85.         fstat (inpipe, &stbuf);
  86.         if (stbuf.st_size != strlen("Startup")+1) {
  87.         kill(child_pid, SIGTERM);
  88.         return -1;
  89.         }
  90.         read (inpipe, buffer, 8);
  91.         if (strncmp("Startup\n", buffer, 8) != 0) {
  92.         kill(child_pid, SIGTERM);
  93.         return -1;
  94.         }
  95.     }
  96.     if (made_file > 0)
  97.         unlink(filename1);
  98.     if (made_file > 1)
  99.         unlink(filename2);
  100.     made_file = 0;
  101.     printf("OK.\n");
  102.     return 0;
  103.     }
  104.     /* FIXME: how can I prevent that the child exits when I hit ^C in the
  105.      * shell window? */
  106.     child_argv[0] = "uae-ui.tk";
  107.     child_argv[1] = my_strdup(filename1);
  108.     child_argv[2] = my_strdup(filename2);
  109.     child_argv[3] = NULL;
  110.     execvp("uae-ui", child_argv);
  111.     /* Shouldn't get here */
  112.     exit(0);
  113.  
  114. }
  115.  
  116. int gui_update(void)
  117. {
  118.  return 0;
  119. }
  120.  
  121. void gui_exit(void)
  122. {
  123.     if (made_file > 0)
  124.     unlink(filename1);
  125.     if (made_file > 1)
  126.     unlink(filename2);
  127.     if (inpipe >= 0)
  128.     close(inpipe);
  129.     if (outpipe >= 0)
  130.     close(outpipe);
  131.     if (child_pid)
  132.     kill(child_pid, SIGTERM);
  133. }
  134.  
  135. void gui_led(int led, int on)
  136. {
  137.     char line[80];
  138.  
  139.     if (child_died || no_gui)
  140.     return;
  141.  
  142.     sprintf(line, "%s %d\n", led == 0 ? "power" : "driveled", on);
  143.     write(outpipe, line, strlen(line));
  144.     if (led > 0) {
  145.     sprintf(line, "%d\n", led-1);
  146.     write(outpipe, line, strlen (line));
  147.     }
  148. }
  149.  
  150. void gui_filename(int num, const char *name)
  151. {
  152.     char line[80];
  153.  
  154.     if (child_died || no_gui)
  155.     return;
  156.  
  157.     sprintf(line, "drivename\n");
  158.     write(outpipe, line, strlen(line));
  159.     sprintf(line, "%d\n", num);
  160.     write(outpipe, line, strlen(line));
  161.     if (name[0] == 0)
  162.     name = "(none)";
  163.     sprintf(line, "%s\n", name);
  164.     write(outpipe, line, strlen(line));
  165. }
  166.  
  167. static void getline(char *p)
  168. {
  169.     int cnt = 80;
  170.     char buf;
  171.     do {
  172.     read(inpipe, &buf, 1);
  173.     *p++ = buf;
  174.     } while (--cnt && buf != '\n');
  175.     *(p-1) = 0;
  176. }
  177.  
  178. void gui_handle_events(void)
  179. {
  180.     char command[100];
  181.     off_t oldsize = stbuf.st_size;
  182.  
  183.     if (child_died || no_gui)
  184.     return;
  185.  
  186.     fstat (inpipe, &stbuf);
  187.     if (stbuf.st_size > oldsize) {
  188.     getline(command);
  189.     if (strcmp (command, "eject") == 0) {
  190.         int drive;
  191.         getline(command);
  192.         drive = atoi(command);
  193.         disk_eject (drive);
  194.     } else if (strcmp (command, "insert") == 0) {
  195.         int drive;
  196.         getline(command);
  197.         drive = atoi(command);
  198.         if (disk_empty(drive)) {
  199.         fd_set fs;
  200.         FD_ZERO(&fs);
  201.         FD_SET(inpipe, &fs);
  202.         write(outpipe, "ok\n", 3);
  203.         select(inpipe+1, &fs, NULL, NULL, NULL);
  204.         getline(command);
  205.         disk_insert (drive, command);
  206.         } else
  207.         write(outpipe, "no\n", 3);
  208.     } else if (strcmp (command, "debug") == 0) {
  209.         activate_debugger();
  210.     } else if (strcmp (command, "bye") == 0) {
  211.         uae_quit ();
  212.     } else if (strcmp (command, "reset") == 0) {
  213.         uae_reset ();
  214.     }
  215.  
  216.     }
  217. }
  218.